ルビを取る処理の習得記録 Part 2 「公式ドキュメントで迷子」~「正規表現ルート確定」
from 青空文庫のルビを取るテキスト処理を習得してみよう
←前回 ルビを取る処理の習得記録 Part 1「テキストファイルを開く」~「公式ドキュメントを見に行く」
ドキュメントの惑星群
文字列で検索すると引っかかったのは以下
Range
範囲オブジェクトのクラス。範囲オブジェクトは文字どおり何らかの意味での範囲を表します。数の範囲はもちろん、日付の範囲や、「"a" から "z" まで」といった文字列の範囲を表すこともできます。
String
文字列のクラスです。ヌル文字を含む任意のバイト列を扱うことができます。文字列の長さにはメモリ容量以外の制限はありません。
君のことは知ってますよ(ほぼ初対面)
なんか数字ではなくって文字の扱いになるんでしょう?
今回""があるのでここ関わってきそう
ホントに探索してるみたいだ
文字列同士の比較・結合
文字列同士の比較・結合などでは両者のエンコーディングを意識する必要があります。
例えば String#== や String#eql? は両者のエンコーディングが等しくバイト列表現が等しい場合にのみ true を返します。このときエンコーディングが UTF-8 であっても正規化せずに比較します。文字列の結合も同様です。異なるエンコーディング同士の文字列を結合する時は明示的にエンコーディングを変換する必要があります。
ヒエッ文字コードは闇じゃんtakker.icon
code:ruby
s = "いろは"
a = s.encode("EUC-JP")
b = s.encode("UTF-8")
p a == b #=> false
s = "合".encode("EUC-JP")
p s + "\u{4f53}".encode("EUC-JP") #=> "合体"
p s + "\u{4f53}" #=> Encoding::CompatibilityError
今回は別のエンコーディングは使わないはずだから気にしなくて良いはず
文字列を結合するときどちらもSHIFT JIS
はずを二回使う
self[nth] = val
nth 番目の文字を文字列 val で置き換えます。
置き換えは近いけど違う
あらかじめ変えたい文字の場所が決まってるときには使える
これだとどうなる?
code:Ruby
buf = "ゴジラ"
buf0 = "ク"
ウワッだめだっ
https://gyazo.com/fd23185e9f9643a51dacf229f747f9f0https://gyazo.com/2466540fdeca8c4d01aed72155c65102
右だとうまく行った
全角・半角の差でもなさそう
https://gyazo.com/d24e3bfc5d393503831350cbc76175ee
奥が深いな~(脱線志向)
この奥の深さは価値がないからスルーしていいと思う……takker.icon
先人たちの遺産という点では価値はあるかもしれないが
沼だな…nishio.icon
Outer Wildをプレイして宇宙空間に投げ出されてるみたいな状況だw
根本的問題ではw
https://gyazo.com/d4afcd8c9e9150a9f9e90c90ef97a03a
nthってそもそもなんだ……?
nthの意味 - goo辞書 英和和英
n番目ってことか
Symbol
シンボルを表すクラス。シンボルは任意の文字列と一対一に対応するオブジェクトです。
アッハイcFQ2f7LRuLYP.icon
インスタンスメソッド(Ruby)探索記録
print
なにかには使うだろう
プロンプトに表示するとか
今回だとファイルそのものの書き換えだからちょっとどうかな
gsub
TryRuby: Learn programming with Ruby
https://gyazo.com/9da76600f7335bce4da8d1802f284ae8
poem.gsub("toast", "honeydew")
poemに対して、gsubのインスタンスメソッドを使うよ
処理はtoastをhoneydewにするよ
使えるのかこれ?
今回は「《 》で囲まれた文字列」の範囲を指定して、それを""に置換したい
「範囲の指定」が必要だなー
いいねnishio.icon
たのしいRuby(第6版)だと置換からリンクして「正規表現を使うメソッド」の紹介があった
subメソッドとgsubメソッドがそれに当たるらしい
$ (/\s+/)
みたいな謎の文言が見える
これあれだな、userscriptでよく見る表現(?)だ
/shokai/文字カウント#59c4f74097c291000080d7bb
これって、正規表現を使ってた…ってコト!?
ここThe Witnessでアレを認識したときの気分
範囲の指定だとRangeが関わってきそう
class Range (Ruby 3.1 リファレンスマニュアル)
範囲オブジェクトのクラス。範囲オブジェクトは文字どおり何らかの意味での範囲を表します。数の範囲はもちろん、日付の範囲や、「"a" から "z" まで」といった文字列の範囲を表すこともできます。
作り方
範囲オブジェクトは、Range.new を用いるほか、範囲演算子(..' または ...')を用いた 演算子式/範囲式 で生成できます。いずれの方法でも始端と終端を与えます。
仮に、「全範囲に対して《 》はあるか?」を判定したいばあい
https://gyazo.com/bfbdeff8777ef45fcb95efa50a78df76
p (歌《うた》の話《はなし》について).cover?(《)
↑これはエラー。
code:error
(file): eval:1:in <main>': undefined local variable or method 歌《うた》の話《はなし》について' for main:Object (NameError)(Exception)
定義できないローカル変数またはメソッド`歌《うた》の話《はなし》について'のためにメインオブジェクト(名前エラー)(例外)
「アリマス、アリマセン、アレハナンデスカ?」みたいな訳になってしまう
「歌《うた》の話《はなし》について」というメソッドはないですよ、と言っているのだろうか
エラーメッセージを読めるようになるのは重要inajob.icontakker.icon
世の中には人間に読ませる気のないエラーを大量に吐く言語もあるんですよ……誰とは言いませんが特にC++とかtakker.icon
言ってるやんけ()Mijinko_SD.iconbsahd.icon
なるほどcFQ2f7LRuLYP.icon
Ruby のエラーメッセージを読み解く(初心者向け)その 1 - Qiita
p (1..5).cover?(3)ならOK
https://gyazo.com/84e821c995883711d6d6b69be2cdc2e2
1から5の範囲に3はありますか?→あります(True)。
TryRuby playground
用事で出かけるので次回ここから
課題を見ろ
もっと初心者向けのドキュメントを探し、文字列を変更している例を探索するといいぞ。
結局このRangeオブジェクトは関係なかった感inajob.icon
たのしいRubyを読む
p.59~正規表現の項がある
ホント文字列処理の話題に出てくるのねこの人(人でない)
正規表現を使うと、
・文字列とパターンの一致(マッチング)を調べる
・パターンを使った文字列の切り出し
などを手軽に行えます。
文字列・パターン・マッチングね
正規表現と文字列のマッチングを行うには、
/パターン/ =~ マッチングしたい文字列
と書きます
もしかして正規表現惑星ルートに着陸し始めてる???
次回→